#include "Splay.h"


Splay::Splay()
{
    Raiz = NULL;
}


void Splay::Insertar(int clave, int lic, std::string modelo)
{
    Registro str;
    str.Licencia=lic;
    str.Modelo=modelo;
    if(Vacio())
        Raiz=new NodoArbol<Registro>(clave,str);
    else
        Insertar(clave,str,&Raiz);
    VIFS::V_WriteLog("Splay: insercion");
}

void Splay::Insertar(int clave, Registro c, NodoArbol<Registro> **raiz)
{
    if (clave < (*raiz)->getClave())
    {
        if((*raiz)->getHizq()==NULL)
            (*raiz)->setHizq(new NodoArbol<Registro>(clave,c));
        else
            Insertar(clave,c,(*raiz)->getHHizq());
        NodoArbol<Registro>* hijo = (*raiz)->getHizq();
        (*raiz)->setHizq(hijo->getHder());
        hijo->setHder(*raiz);
        *raiz=hijo;
        VIFS::V_WriteLog("Splay: Zig");
    }
    else
        if(clave > (*raiz)->getClave())
        {
            if((*raiz)->getHder()==NULL)
                (*raiz)->setHder(new NodoArbol<Registro>(clave,c));
            else
                Insertar(clave,c,(*raiz)->getHHder());
            NodoArbol<Registro>* hijo = (*raiz)->getHder();
            (*raiz)->setHder(hijo->getHizq());
            hijo->setHizq(*raiz);
            *raiz=hijo;
            VIFS::V_WriteLog("Splay: Zag");
        }
}

NodoArbol<Registro>* Splay::Buscar(int clave)
{
    if(Raiz->getClave()==clave)
        return Raiz;
    else
        return Buscar(clave,&Raiz);
}
NodoArbol<Registro>* Splay::Buscar(int clave, NodoArbol<Registro> **raiz)
{
    NodoArbol<Registro>* ret = NULL;
    if((*raiz)->getClave()>clave)
    {
        if ((*raiz)->getHizq()->getClave()==clave)
        {
            ret=(*raiz)->getHizq();
        }
        else
        {
            ret=Buscar(clave,(*raiz)->getHHizq());
        }
        NodoArbol<Registro>* hijo= (*raiz)->getHizq();
        (*raiz)->setHizq(hijo->getHder());
        hijo->setHder(*raiz);
        *raiz=hijo;
        VIFS::V_WriteLog("Splay: zig");
    }
    else
    {
        if((*raiz)->getClave()<clave)
        {
            if((*raiz)->getHder()->getClave()==clave)
                ret=(*raiz)->getHder();
            else
                ret=Buscar(clave,(*raiz)->getHHder());

            NodoArbol<Registro>* hijo = (*raiz)->getHder();
            (*raiz)->setHder(hijo->getHizq());
            hijo->setHizq(*raiz);
            *raiz=hijo;
            VIFS::V_WriteLog("Splay: zag");
        }
    }
    return ret;
}



/*
void Splay::Splay2(int clave)
{
    Raiz = splay_A(clave,Raiz);
}


inline NodoArbol<Registro>* Splay::RR_Rotate(NodoArbol<Registro>* k2)  //rotacion derecha
{
    NodoArbol<Registro>* k1 = k2->getHizq();
    k2->setHizq(k1->getHder());
    k1->setHder(k2);
    return k1;
}

inline NodoArbol<Registro>* Splay::LL_Rotate(NodoArbol<Registro>* k2)  //rotacion izquierda
{
    NodoArbol<Registro>* k1 = k2->getHder();
    k2->setHder(k1->getHizq());
    k1->setHizq(k2);
    return k1;
}

NodoArbol<Registro>* Splay::splay_A(int clave, NodoArbol<Registro> *raiz)
{
    if(!raiz)
        return NULL;
     NodoArbol<Registro> * header;
     header->setHder(NULL);
     header->setHizq(NULL);
     NodoArbol<Registro>* AMaxIzq = header;
     NodoArbol<Registro>* AMinDer = header;




     *Mediante este bloque del while se realiza la implemenatcion del arbol de arriba hacia abajo.
     *Todo depende si la llave es menor, mayor o igual a la raiz .


     while(1)
     {
         if (clave < raiz->getClave())
         {
             if(!raiz->getHizq())
                 break;
             if (clave < raiz->getHizq()->getClave())
             {
                 raiz = RR_Rotate(raiz);
                 if(!raiz->getHizq())
                     break;
             }
             AMinDer->setHizq(raiz);
             AMinDer = AMinDer->getHizq();
             raiz = raiz->getHizq();
             AMinDer->setHizq(NULL);
         }
         else if (clave > raiz->getClave())
         {
             if(!raiz->getHder())
                 break;
             if(clave>raiz->getHder()->getClave())
             {
                 raiz = LL_Rotate(raiz);
                 if(!raiz->getHder())
                    break;
         }
         AMaxIzq->setHizq(raiz);
         AMaxIzq = AMaxIzq->getHder();
         raiz=raiz->getHizq();
         AMaxIzq->setHder(NULL);
         }
         else
         break;
         }
         AMaxIzq->setHder(raiz->getHizq());
         AMinDer->setHizq(raiz->getHder());
         raiz->setHizq(header->getHder());
         raiz->setHder(header->getHizq());
         return raiz;
         }
        NodoArbol<Registro>* nuevoNodo(clave,temp);
        {
        NodoArbol<Registro> pNodo = new NodoArbol<Registro>;
        if(!pNodo)
        {
            fprintf(stderr, "No estÃ¡!\n");
        }

     } //fin del while
        pNodo.setClave(clave);
        pNodo.setContenedor(temp);
        pNodo.setHizq(NULL);
        pNodo.setHder(NULL);
        return pNodo;
}

NodoArbol<Registro>* Insertar(int clave, int placa, std::string modelo, NodoArbol<Registro>*raiz)
{
    Registro temp;
    temp.Licencia = placa;
    temp.Modelo = modelo;
    static NodoArbol<Registro>* pNodo = NULL;
    if(!pNodo){

        pNodo = new NodoArbol<Registro>(clave,temp);
    }else{
        pNodo->setClave(clave);
        pNodo->setContenedor(temp);
    }
    if(!raiz){
        raiz = pNodo;
        pNodo = NULL;
        return raiz;
    }
    raiz = splay_A(clave,raiz);
    //Splay2(clave);


    if(clave < raiz->getClave())
    {
       pNodo->setHizq(raiz->getHizq());
       pNodo->setHder(raiz);
       raiz->setHizq(NULL);
       raiz = pNodo;
    }
    else if (clave > raiz->getClave()){
        pNodo->setHder(raiz->getHder());
        pNodo->setHizq(raiz);
        raiz->setHder(NULL);
        raiz = pNodo;
    }
    else
        return raiz;
    pNodo = NULL;
    return raiz;
}

NodoArbol<Registro>* Splay::BuscarS(int clave)
{
    if(Raiz == NULL)
        return 0;
    else
        return splay_A(clave,Raiz);
        //Splay2(clave);
}
*/

